#include <iostream>
//#include <sstream>
#include <fstream>
//#include <memory>
#include <string>
//#include <json.h>
#include "bundle.h"

int main(int argc, char **argv)
{
    // Json序列化
    // char* name = "小明";
    // int age = 18;
    // float score[] = {100, 99.0, 98.5};

    // Json::Value root;
    // root["姓名"] = name;
    // root["年龄"] = age;
    // root["成绩"].append(score[0]);
    // root["成绩"].append(score[1]);
    // root["成绩"].append(score[2]);
    // Json::StreamWriterBuilder swb;
    // std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());
    // std::stringstream ss;
    // sw->write(root, &ss);
    // std::cout << ss.str() << std::endl;

    // return 0;

    //Json反序列化
    // std::string str = R"({"姓名":"小明", "年龄":18, "成绩":[76.5, 55, 88]})";
    // Json::Value root;
    // Json::CharReaderBuilder crb;
    // std::unique_ptr<Json::CharReader> cr(crb.newCharReader());
    // std::string err;
    // cr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);
    // std::cout << root["姓名"].asString() << std::endl;
    // std::cout << root["年龄"].asInt() << std::endl;
    // for(auto it = root["成绩"].begin(); it != root["成绩"].end(); it++)
    // {
    //     std::cout << it->asFloat() << std::endl;
    // }
    
    // return 0;

    //bundle压缩测试
    // std::cout <<"argv[1] 是原始文件路径名称\n";
    // std::cout <<"argv[2] 是压缩包名称\n";
    // if (argc < 3) return -1;
    
    // std::string ifilename = argv[1];
    // std::string ofilename = argv[2];

    // std::ifstream ifs;
    // ifs.open(ifilename, std::ios::binary);
    // ifs.seekg(0, std::ios::end);
    // size_t fsize = ifs.tellg();
    // ifs.seekg(0, std::ios::beg);
    // std::string body;
    // body.resize(fsize);
    // ifs.read(&body[0], fsize);

    // std::string packed = bundle::pack(bundle::LZIP, body);

    // std::ofstream ofs;
    // ofs.open(ofilename, std::ios::binary);
    // ofs.write(&packed[0], packed.size());

    // ifs.close();
    // ofs.close();
    // return 0;

    //bundle解压测试
    if (argc < 3) 
    {
        printf("argv[1]是压缩包名称\n");
        printf("argv[2]是解压后的文件名称\n");
        return -1; 
    }
    std::string ifilename = argv[1];//压缩包名
    std::string ofilename = argv[2];//解压缩后文件名
    
    std::ifstream ifs;
    ifs.open(ifilename, std::ios::binary);
    ifs.seekg(0, std::ios::end);
    size_t fsize = ifs.tellg();
    ifs.seekg(0, std::ios::beg);
    std::string body;
    body.resize(fsize);
    ifs.read(&body[0], fsize);
    ifs.close();

    std::string unpacked = bundle::unpack(body);
    std::ofstream ofs;
    ofs.open(ofilename, std::ios::binary);
    ofs.write(&unpacked[0], unpacked.size());
    ofs.close();
    return 0;

}